package com.moyoutian.leetcode;

/**
 * 2006. 差的绝对值为 K 的数对数目
 * <p>
 * <p>
 * 给你一个整数数组 nums 和一个整数 k ，请你返回数对 (i, j) 的数目，满足 i < j 且 |nums[i] - nums[j]| == k 。
 * <p>
 * |x| 的值定义为：
 * <p>
 * 如果 x >= 0 ，那么值为 x 。
 * <p>
 * 如果 x < 0 ，那么值为 -x 。
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [1,2,2,1], k = 1
 * <p>
 * 输出：4
 * <p>
 * 解释：差的绝对值为 1 的数对为：
 * <p>
 * - [<b>1</b>,<b>2</b>,2,1]
 * <p>
 * - [<b>1</b>,2,<b>2</b>,1]
 * <p>
 * - [1,<b>2</b>,2,<b>1</b>]
 * <p>
 * - [1,2,<b>2</b>,<b>1</b>]
 * <p>
 * <p>
 * 示例 2：
 * <p>
 * 输入：nums = [1,3], k = 3
 * <p>
 * 输出：0
 * <p>
 * 解释：没有任何数对差的绝对值为 3 。
 * <p>
 * <p>
 * 示例 3：
 * <p>
 * 输入：nums = [3,2,1,5,4], k = 2
 * <p>
 * 输出：3
 * <p>
 * 解释：差的绝对值为 2 的数对为：
 * <p>
 * - [3,2,1,5,4]
 * <p>
 * - [3,2,1,5,4]
 * <p>
 * - [3,2,1,5,4]
 * <p>
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= nums.length <= 200
 * <p>
 * 1 <= nums[i] <= 100
 * <p>
 * 1 <= k <= 99
 */
public class Demo2006 {

    /**
     * 9:28
     * <p>
     * 暴力 AC  9:30
     * hash AC  9:56
     */
    public static void main(String[] args) {
        int[] nums = {1, 2, 2, 1};
        int k = 1;
        System.out.println(countKDifference(nums, k));
    }

    /**
     *
     */
    public static int countKDifference(int[] nums, int k) {
        int re = 0;
        int[] dp = new int[101];
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            if (num - k > 0) {
                re += dp[num - k];
            }
            if (num + k < 101) {
                re += dp[num + k];
            }
            dp[nums[i]]++;
        }
        return re;
    }

    public static int countKDifferenceB(int[] nums, int k) {
        int re = 0;
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (Math.abs(nums[j] - nums[i]) == k) {
                    re++;
                }
            }
        }
        return re;
    }


}
